// index.ts
// Office转PDF功能页面

import ApiConfig from '../../config/api.config';

// 接口定义
interface ConvertResult {
  success: boolean;
  file_id: string;
  original_name: string;
  message: string;
  conversion_time?: number;
  file_size?: number;
}

interface SelectedFile {
  name: string;
  path: string;
  size: number;
  type: string;
}

Component({
  data: {
    // 文件相关
    selectedFile: null as SelectedFile | null,
    fileIcon: '📄',
    fileSize: '',
    
    // 转换状态
    isConverting: false,
    progress: 0,
    
    // 结果
    convertResult: null as ConvertResult | null,
    resultFileSize: '',
    
    // 错误处理
    errorMessage: '',
    
    // 支持的文件类型
    supportedTypes: [
      'application/vnd.openxmlformats-officedocument.wordprocessingml.document', // .docx
      'application/msword', // .doc
      'application/vnd.openxmlformats-officedocument.presentationml.presentation', // .pptx
      'application/vnd.ms-powerpoint', // .ppt
      'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', // .xlsx
      'application/vnd.ms-excel', // .xls
    ]
  },

  methods: {
    // 跳转到关于页面
    goToAbout() {
      wx.navigateTo({
        url: '../logs/logs'
      });
    },

    // 选择文件
    chooseFile() {
      const self = this;
      
      wx.chooseMessageFile({
        count: 1,
        type: 'file',
        success: (res: WechatMiniprogram.ChooseMessageFileSuccessCallbackResult) => {
          const file = res.tempFiles[0];
          
          // 检查文件类型
          if (!self.isFileTypeSupported(file.type, file.name)) {
            self.showError('不支持的文件格式！请选择Office文档（.doc, .docx, .ppt, .pptx, .xls, .xlsx）');
            return;
          }
          
          // 检查文件大小（限制50MB）
          if (file.size > 50 * 1024 * 1024) {
            self.showError('文件大小超过限制！请选择小于50MB的文件');
            return;
          }
          
          // 设置选中的文件
          self.setData({
            selectedFile: {
              name: '待上传文件', // 不使用微信返回的文件名
              path: file.path,
              size: file.size,
              type: file.type
            },
            fileIcon: self.getFileIcon(file.name), // 图标仍可使用扩展名判断
            fileSize: self.formatFileSize(file.size),
            errorMessage: ''
          });
        },
        fail: (err) => {
          console.error('选择文件失败:', err);
          self.showError('选择文件失败，请重试');
        }
      });
    },

    // 检查文件类型是否支持
    isFileTypeSupported(mimeType: string, fileName: string): boolean {
      // 通过MIME类型检查
      if (this.data.supportedTypes.includes(mimeType)) {
        return true;
      }
      
      // 通过文件扩展名检查（作为备用方案）
      const extension = fileName.toLowerCase().split('.').pop();
      const supportedExtensions = ['doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx'];
      return supportedExtensions.includes(extension || '');
    },

    // 获取文件图标
    getFileIcon(fileName: string): string {
      const extension = fileName.toLowerCase().split('.').pop();
      switch (extension) {
        case 'doc':
        case 'docx':
          return '📝';
        case 'ppt':
        case 'pptx':
          return '📊';
        case 'xls':
        case 'xlsx':
          return '📈';
        default:
          return '📄';
      }
    },

    // 格式化文件大小
    formatFileSize(bytes: number): string {
      if (bytes === 0) return '0 B';
      const k = 1024;
      const sizes = ['B', 'KB', 'MB', 'GB'];
      const i = Math.floor(Math.log(bytes) / Math.log(k));
      return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
    },

    // 移除文件
    removeFile() {
      this.setData({
        selectedFile: null,
        fileIcon: '📄',
        fileSize: '',
        convertResult: null,
        errorMessage: ''
      });
    },

    // 开始转换
    convertFile() {
      if (!this.data.selectedFile) {
        this.showError('请先选择文件');
        return;
      }

      this.setData({
        isConverting: true,
        progress: 0,
        convertResult: null,
        errorMessage: ''
      });

      // 开始进度动画
      this.startProgressAnimation();

      // 上传文件
      this.uploadFile();
    },

    // 上传文件到后端
    uploadFile() {
      const self = this;
      const file = this.data.selectedFile;
      
      if (!file) return;

      const uploadTask = wx.uploadFile({
        url: ApiConfig.getUploadUrl(),
        filePath: file.path,
        name: 'file',
        header: {
          'accept': 'application/json'
        },
        success: (res) => {
          console.log('上传成功:', res);
          
          try {
            const result = JSON.parse(res.data) as ConvertResult;
            
            if (result.success) {
              self.setData({
                convertResult: result,
                resultFileSize: self.formatFileSize(result.file_size || 0),
                conversionTime: result.conversion_time ? result.conversion_time.toFixed(2) + '秒' : '--',
                isConverting: false,
                progress: 100
              });
            } else {
              self.showError(result.message || '转换失败，请重试');
              self.setData({ isConverting: false });
            }
          } catch (error) {
            console.error('解析响应失败:', error);
            self.showError('服务器响应异常，请重试');
            self.setData({ isConverting: false });
          }
        },
        fail: (err) => {
          console.error('上传失败:', err);
          self.showError('网络连接失败，请检查网络连接后重试');
          self.setData({ isConverting: false });
        }
      });

      // 监听上传进度
      uploadTask.onProgressUpdate((res) => {
        self.setData({
          progress: res.progress
        });
      });
    },

    // 进度动画
    startProgressAnimation() {
      const self = this;
      let currentProgress = 0;
      
      const timer = setInterval(() => {
        if (currentProgress < 90 && self.data.isConverting) {
          currentProgress += Math.random() * 15;
          if (currentProgress > 90) currentProgress = 90;
          
          self.setData({
            progress: Math.floor(currentProgress)
          });
        } else {
          clearInterval(timer);
        }
      }, 500);
    },

    // 下载PDF文件
    downloadFile() {
      const result = this.data.convertResult;
      if (!result) return;

      wx.showLoading({
        title: '准备下载...',
        mask: true
      });

      // 使用ApiConfig获取下载URL
      const downloadUrl = ApiConfig.getDownloadUrl(result.file_id);

      console.log('下载URL:', downloadUrl);
      
      wx.downloadFile({
        url: downloadUrl,
        success: (res) => {
          wx.hideLoading();
          
          if (res.statusCode === 200) {
            // 保存文件到本地
            wx.saveFile({
              tempFilePath: res.tempFilePath,
              success: (saveRes) => {
                wx.showToast({
                  title: '下载成功',
                  icon: 'success',
                  duration: 2000
                });
                
                // 打开文件
                wx.openDocument({
                  filePath: saveRes.savedFilePath,
                  showMenu: true,
                  success: () => {
                    console.log('打开文档成功');
                  },
                  fail: (err) => {
                    console.error('打开文档失败:', err);
                    wx.showToast({
                      title: '文件已保存到本地',
                      icon: 'success'
                    });
                  }
                });
              },
              fail: (err) => {
                console.error('保存文件失败:', err);
                wx.showToast({
                  title: '保存失败',
                  icon: 'error'
                });
              }
            });
          } else {
            wx.showToast({
              title: '下载失败',
              icon: 'error'
            });
          }
        },
        fail: (err) => {
          wx.hideLoading();
          console.error('下载失败:', err);
          wx.showToast({
            title: '下载失败，请重试',
            icon: 'error'
          });
        }
      });
    },

    // 开始新的转换
    startNewConvert() {
      this.setData({
        selectedFile: null,
        fileIcon: '📄',
        fileSize: '',
        convertResult: null,
        errorMessage: '',
        isConverting: false,
        progress: 0
      });
    },

    // 重试转换
    retryConvert() {
      this.convertFile();
    },

    // 显示错误信息
    showError(message: string) {
      this.setData({
        errorMessage: message,
        isConverting: false
      });
      
      wx.showToast({
        title: message,
        icon: 'error',
        duration: 3000
      });
    }
  }
});